home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / iutil / insert.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  1.9 KB  |  94 lines

  1. # include    <ingres.h>
  2. # include    <access.h>
  3. # include    <catalog.h>
  4. # include    <btree.h>
  5. # include    <sccs.h>
  6.  
  7. SCCSID(@(#)insert.c    8.1    12/31/84)
  8.  
  9. /*
  10. **    INSERT - add a new tuple to a relation
  11. **
  12. **    Insert puts a given tuple into a relation in
  13. **    the "correct" position.
  14. **
  15. **    If insert is called with checkdups == TRUE then
  16. **    the tuple will not be inserted if it is a duplicate
  17. **    of some already existing tuple. If the relation is a
  18. **    heap then checkdups is made false.
  19. **
  20. **    Tid will be set to the tuple id where the
  21. **    tuple is placed.
  22. **
  23. **    returns:
  24. **        <0  fatal error
  25. **        0   success
  26. **        1   tuple was a duplicate
  27. **        2   bad lid
  28. */
  29.  
  30. insert(d, tid, tuple, checkdups)
  31. register DESC    *d;
  32. register TID    *tid;
  33. char        *tuple;
  34. bool        checkdups;
  35. {
  36.     register int    i, j;
  37.     int        need;
  38.     char        *tp;
  39.     long        lid[MAXLID], l;
  40.     char        btree[MAXNAME + 4];
  41.     TID        tidpos;
  42.     struct locator    tidloc;
  43.     short        nolid;
  44.  
  45. #    ifdef xATR1
  46.     if (tTf(24, 0))
  47.     {
  48.         printf("insert:%.14s,", d->reldum.relid);
  49.         dumptid(tid);
  50.         printup(d, tuple);
  51.     }
  52. #    endif
  53.  
  54.     if (d->reldum.reldim != 0)
  55.         checkdups = FALSE;
  56.  
  57.     /* determine how much space is needed for tuple */
  58.     need = canonical(d, tuple);
  59.  
  60.     /* find the "best" page to place tuple */
  61.     if (i = findbest(d, tid, tuple, need, checkdups))
  62.         return (i);
  63.  
  64.     if (d->reldum.reldim > 0)
  65.     /* get lids and check for errors */
  66.     {
  67.         btreename(d->reldum.relid, btree);
  68.         tp = tuple + d->reldum.relwid - LIDSIZE * d->reldum.reldim;
  69.         bmove(tp, lid, LIDSIZE * d->reldum.reldim);
  70.         nolid = 0;
  71.         for (i = 0; i < d->reldum.reldim; ++i)
  72.         {
  73.             if (lid[i] < 0 || (lid[i] > 0 && nolid))
  74.                 return(2);
  75.             nolid = !(lid[i]);
  76.         }
  77.     }
  78.  
  79.     if (d->reldum.reldim > 0)
  80.     {
  81.         if (insert_mbtree(d, btree, lid, tid, &tidpos) < 0)
  82.             return(2);
  83.         tp = tuple + d->reldum.relwid - LIDSIZE * d->reldum.reldim;
  84.         bmove(lid, tp, d->reldum.reldim * LIDSIZE);
  85.     }
  86.  
  87.     /* put tuple in position "tid" */
  88.     put_tuple(tid, Acctuple, need);
  89.  
  90.     d->reladds++;
  91.  
  92.     return (0);
  93. }
  94.